#include "debug.h"
#include "../DDIC/AllDDIC.h"

/*RM9300 Gamma?????*/
u8 RM0A0_Gamma_r[54]= {
    0x00,0x01, 0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x0C,0x0D, 0x0E,0x0F, 0x10,0x11,
    0x12,0x13, 0x14,0x15, 0x16,0x17, 0x18,0x19, 0x1A,0x1B, 0x1C,0x1D, 0x1E,0x1F, 0x20,0x21, 0x22,0x23,
	  0x24,0x25, 0x26,0x27, 0x28,0x29, 0x2A,0x2B, 0x2D,0x2F, 0x30,0x31, 0x32,0x33, 0x34,0x35, 0x36,0x37, 
};
u8 RM0A0_Gamma_g[54]= {   
	  0x38,0x39, 0x3A,0x3B, 0x3D,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x46,0x47, 0x48,0x49, 0x4A,0x4B,
    0x4C,0x4D, 0x4E,0x4F, 0x50,0x51, 0x52,0x53, 0x54,0x55, 0x56,0x58, 0x59,0x5A, 0x5B,0x5C, 0x5D,0x5E,
    0x5F,0x60, 0x61,0x62, 0x63,0x64, 0x65,0x66, 0x67,0x68, 0x69,0x6A, 0x6B,0x6C, 0x6D,0x6E, 0x6F,0x70,		
};
u8 RM0A0_Gamma_b[54]={
	  0x71,0x72, 0x73,0x74, 0x75,0x76, 0x77,0x78, 0x79,0x7A, 0x7B,0x7C, 0x7D,0x7E, 0x7F,0x80, 0x81,0x82,
	  0x83,0x84, 0x85,0x86, 0x87,0x88, 0x89,0x8A, 0x8B,0x8C, 0x8D,0x8E, 0x8F,0x90, 0x91,0x92, 0x93,0x94,
	  0x95,0x96, 0x97,0x98, 0x99,0x9A, 0x9B,0x9C, 0x9D,0x9E, 0x9F,0xA0, 0xA2,0xA3, 0xA4,0xA5, 0xA6,0xA7,
};

u8 RM0A0_Gamma_r1[27]= {
		0x00,0x01, 0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x12,0x13, 0x1C,0x1D, 0x20,0x21,
		0x24,0x25, 0x28,0x29, 0x2D,0x2F, 0x36,0x37,  
};
u8 RM0A0_Gamma_g1[54]= {   
		0x38,0x39, 0x3A,0x3B, 0x3D,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x4C,0x4D, 0x56,0x58, 0x5B,0x5C,
		0x5F,0x60, 0x63,0x64, 0x67,0x68, 0x6F,0x70,		
};
u8 RM0A0_Gamma_b1[54]={
		0x71,0x72, 0x73,0x74, 0x75,0x76, 0x77,0x78, 0x79,0x7A, 0x7B,0x7C, 0x83,0x84, 0x8D,0x8E, 0x91,0x92,
		0x95,0x96, 0x99,0x9A, 0x9D,0x9E, 0xA6,0xA7,
};
u8 RM0A0_Gamma3_r1[54]={
	  0x00,0x01, 0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x0C,0x0D, 0x0E,0x0F, 0x10,0x11,
		0x12,0x13, 0x14,0x15, 0x16,0x17, 0x18,0x19,
};
u8 RM0A0_Gamma3_g1[54]={
		0x1A,0x1B, 0x1C,0x1D, 0x1E,0x1F, 0x20,0x21, 0x22,0x23, 0x24,0x25, 0x26,0x27, 0x28,0x29, 0x2A,0x2B,
		0x2D,0x2F, 0x30,0x31, 0x32,0x33, 0x34,0x35
};
u8 RM0A0_Gamma3_b1[54]={
		0x36,0x37, 0x38,0x39, 0x3A,0x3B, 0x3D,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x46,0x47, 0x48,0x49,
		0x4A,0x4B, 0x4C,0x4D, 0x4E,0x4F, 0x50,0x51
};

u8 RM0A0_otptime=0;
//u8 RM35x_otptime=0;

void RM690A0_Write_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void RM690A0_Read_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void RM690A0_Gamma_OTP_Start(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data,u8 RM0A0_otptime);
void RM690A0_auto_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void RM690A0_RGB4_bit(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
//----------------------------------------------RM69091----------------------------------------------
void RM690A0_Write_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    u8 buffer1[5];

    if((buffer[3]&0x03) == 0x00)
    {
		SPI_PANEL_Write_code(SigMode,channel,0xfe,0x02);
    }
	
    else if((buffer[3]&0x03) == 0x01)
    {  
		SPI_PANEL_Write_code(SigMode,channel,0xfe,0x03);
    }   
    else if((buffer[3]&0x03) == 0x02)
    {
		SPI_PANEL_Write_code(SigMode,channel,0xfe,0x0D);
    }
		if((buffer[3]&0x80) == 0x80) //27ѳ֣
		{
			SPI_PANEL_Write_code(SigMode,channel,0xAB,0x01);
		}
		else
		{
			SPI_PANEL_Write_code(SigMode,channel,0xAB,0x81);
		}	
		
    for( i = 0;i<buffer[2]-1;i++) 
    {	 
		 if((buffer[3]&0x03) == 0x00 || (buffer[3]&0x03) == 0x01)
		 {
			if((buffer[3]&0x80) == 0x80){
				 if     ((buffer[3]&0x70)==0x10) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma_r[i],buffer[i+4]);
				 else if((buffer[3]&0x70)==0x20) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma_g[i],buffer[i+4]);
				 else if((buffer[3]&0x70)==0x30) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma_b[i],buffer[i+4]);
			}
			else{
				 if     ((buffer[3]&0x70)==0x10) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma_r1[i],buffer[i+4]); 
				 else if((buffer[3]&0x70)==0x20) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma_g1[i],buffer[i+4]);
				 else if((buffer[3]&0x70)==0x30) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma_b1[i],buffer[i+4]);
			}    				
		 }		
		else if((buffer[3]&0x03) == 0x02)
		{
				 if     ((buffer[3]&0x70)==0x10) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma3_r1[i],buffer[i+4]);  
				 else if((buffer[3]&0x70)==0x20) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma3_g1[i],buffer[i+4]);   
				 else if((buffer[3]&0x70)==0x30) SPI_PANEL_Write_code(SigMode,channel,RM0A0_Gamma3_b1[i],buffer[i+4]);   
		}
		delay_ms(3);
    }
    buffer[4] = Uart_Error_None;
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?Gamma??  :ok  
		//RM690A0_w_end: ;
}

void RM690A0_Read_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 Page = 0x02;
  	if((buffer[3]&0x03) == 0x00)
		{
			Page = 0x02;
			SPI_PANEL_Write_code(SigMode,channel,0xfe,0x02);
		}
		else if((buffer[3]&0x03) == 0x01)
		{
			Page = 0x03;
			SPI_PANEL_Write_code(SigMode,channel,0xfe,0x03); 
		}
		else if((buffer[3]&0x03) == 0x02)
		{
			Page = 0x0D;
			SPI_PANEL_Write_code(SigMode,channel,0xfe,0x0D); 
		}
		if((buffer[3]&0x80) == 0x80) //27ѳ֣
		{
			SPI_PANEL_Write_code(SigMode,channel,0xAB,0x01); 
		}
		else
		{
			SPI_PANEL_Write_code(SigMode,channel,0xAB,0x81); 
		}	
		for( i = 0;i<buffer[2]-1;i++)			 	
		{  	                               
			if((buffer[3]&0x03) == 0x00 || (buffer[3]&0x03) == 0x01)
			{
			  if((buffer[3]&0x80) == 0x80)
				{
				buffer1[1] = ((buffer[3]&0x70)==0x10) ? RM0A0_Gamma_r[i] : (((buffer[3]&0x70)==0x20) ? RM0A0_Gamma_g[i] : RM0A0_Gamma_b[i]);
				}
				else
				{
				  buffer1[1] = ((buffer[3]&0x70)==0x10) ? RM0A0_Gamma_r1[i] : (((buffer[3]&0x70)==0x20) ? RM0A0_Gamma_g1[i] : RM0A0_Gamma_b1[i]);
				}
			}
			else if((buffer[3]&0x03) == 0x02)
			{
				buffer1[1] = ((buffer[3]&0x70)==0x10) ? RM0A0_Gamma3_r1[i] : (((buffer[3]&0x70)==0x20) ? RM0A0_Gamma3_g1[i] : RM0A0_Gamma3_b1[i]);
			}
			delay_ms(6);
			buffer[4+i] = SPI4_PANEL_Read_u8_Data_page(SigMode,channel,Page,buffer1[1]);
		}		
	
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ??? Gamma??  :ok  
}




void RM690A0_Gamma_OTP_Start(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data,u8 RM0A0_otptime)
{
    u16 tmp;
    u8 buffer1[3];  
//SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0xFFFD);   
//		SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);  
    delay_ms(5);
//    buffer1[0] = 0x02;
//    buffer1[1] = 0xFE;
//    buffer1[2] = 0x00;
//    SSD2828_W_Array(SigMode,channel,buffer1,0);     // UCS????
	
//    delay_ms(5);
//    buffer1[0] = 0x02;
//    buffer1[1] = 0x28;
//	  buffer1[2] = 0x00;
//    SSD2828_W_Array(SigMode,channel,buffer1,0);     // ??? 
//	
//    delay_ms(100);  //otp
//    buffer1[0] = 0x02;
//    buffer1[1] = 0xFE;
//    buffer1[2] = 0x01; 
//    SSD2828_W_Array(SigMode,channel,buffer1,0);     //Page0
	SPI_PANEL_Write_code(SigMode,channel,0xfe,0x00);
	SPI_PANEL_Write_code(SigMode,channel,0x28,0x00);
	SPI_PANEL_Write_code(SigMode,channel,0xfe,0x01);
	buffer1[0] = 0x02;
	
	
    if(buffer[3] == 0x00)				//OTP page 10 20 30 40 50 60 70 80 
	{
//        buffer1[1] = 0xF0;///0xF6
//        buffer1[2] = 0xA6;////0x08	    			
//        SSD2828_W_Array(SigMode,channel,buffer1,0);     //  
	SPI_PANEL_Write_code(SigMode,channel,0xf0,0xbe);
//        buffer1[1] = 0xF6;///0xF6
//        buffer1[2] = 0x4C;////0x08	    			
//        SSD2828_W_Array(SigMode,channel,buffer1,0);     //  
	SPI_PANEL_Write_code(SigMode,channel,0xf6,0x1c);
	}
	else if(buffer[3] == 0x10)		//otp page10
	{
//			  buffer1[1] = 0xF6;
//			  buffer1[2] = 0x04;
//			  SSD2828_W_Array(SigMode,channel,buffer1,0);
		SPI_PANEL_Write_code(SigMode,channel,0xf6,0x04);
	}
	else if(buffer[3] == 0x20)	//otp page20
	{
//			buffer1[1] = 0xF6;
//			buffer1[2] = 0x08;
//			SSD2828_W_Array(SigMode,channel,buffer1,0);		
		SPI_PANEL_Write_code(SigMode,channel,0xf6,0x08);			
	}
	else if(buffer[3] == 0x30)	//otp page30
	{
//			  buffer1[1] = 0xF6;
//				buffer1[2] = 0x10;
//				SSD2828_W_Array(SigMode,channel,buffer1,0);		
		SPI_PANEL_Write_code(SigMode,channel,0xf6,0x10);
	}
	else if(buffer[3] == 0x40)	//otp page40
	{
//			  buffer1[1] = 0xF0;
//				buffer1[2] = 0xA0;
//				SSD2828_W_Array(SigMode,channel,buffer1,0);			
		SPI_PANEL_Write_code(SigMode,channel,0xf0,0xa0);
	}
	else if(buffer[3] == 0x50)	//otp page50
	{
//			  buffer1[1] = 0xF0;
//				buffer1[2] = 0x10;
//				SSD2828_W_Array(SigMode,channel,buffer1,0);			
		SPI_PANEL_Write_code(SigMode,channel,0xf0,0x10);			
	}
	else if(buffer[3] == 0x60)	//otp page60
	{
//			  buffer1[1] = 0xF0;
//				buffer1[2] = 0x08;
//				SSD2828_W_Array(SigMode,channel,buffer1,0);		
		SPI_PANEL_Write_code(SigMode,channel,0xf0,0x08);			
	}
	else if(buffer[3] == 0x70)	//otp page70
	{
//			  buffer1[1] = 0xF0;
//				buffer1[2] = 0x04;
//				SSD2828_W_Array(SigMode,channel,buffer1,0);	
		SPI_PANEL_Write_code(SigMode,channel,0xf0,0x04);
	}
	else if(buffer[3] == 0x80)	//otp page80
	{
//			  buffer1[1] = 0xF6;
//				buffer1[2] = 0x40;
//				SSD2828_W_Array(SigMode,channel,buffer1,0);		
		SPI_PANEL_Write_code(SigMode,channel,0xf0,0x02);
	}

//    buffer1[0] = 0x02;//MTPCTR
//    buffer1[1] = 0xF2;
//    buffer1[2] = 0x03;
//    SSD2828_W_Array(SigMode,channel,buffer1,0);    
//	
//    buffer1[0] = 0x02;
//    buffer1[1] = 0xF3;
//    buffer1[2] = 0xA5;
//    SSD2828_W_Array(SigMode,channel,buffer1,0);  

//    buffer1[0] = 0x02;
//    buffer1[1] = 0xF4;
//    buffer1[2] = 0x5A;
//    SSD2828_W_Array(SigMode,channel,buffer1,0);  

//    buffer1[0] = 0x02;
//    buffer1[1] = 0xF5;
//    buffer1[2] = 0x3C;
//    SSD2828_W_Array(SigMode,channel,buffer1,0); 
	SPI_PANEL_Write_code(SigMode,channel,0xf2,0x03);
	SPI_PANEL_Write_code(SigMode,channel,0xf3,0xa5);
	SPI_PANEL_Write_code(SigMode,channel,0xf4,0x5a);
	SPI_PANEL_Write_code(SigMode,channel,0xf5,0x3c);
                      
    delay_ms(1500);         // wait for >400 ms   
    buffer[4] = Uart_Error_Oth;
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?OTP??  :ok
}
void RM690A0_auto_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 buffer1[3];
    //SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);	
	//	SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
		delay_ms(5);	

	
//		buffer1[0] = 0x02;
//		buffer1[1] = 0xFE;
//		buffer1[2] = 0x02;              // GAMMA1  page1
//		SSD2828_W_Array(SigMode,channel,buffer1,0);	
	//	SSD2828_W_Reg(SigMode,channel,0xBC,0x02);
	
   // for( i = 0;i<buffer[2];i++) 
   // {	 
        //    SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|buffer[i+3]);  
				SPI_PANEL_Write_code(SigMode,channel,buffer[3],buffer[4]);
				SPI_PANEL_Write_code(SigMode,channel,buffer[5],buffer[6]);
			
				SPI_PANEL_Write_code(SigMode,channel,buffer[7],buffer[8]);
				SPI_PANEL_Write_code(SigMode,channel,buffer[9],buffer[10]);
			
				SPI_PANEL_Write_code(SigMode,channel,buffer[11],buffer[12]);
				SPI_PANEL_Write_code(SigMode,channel,buffer[13],buffer[14]);
			//SPI_Write_code(SigMode,channel,buffer[i+3],buffer[i+4]);
            delay_ms(2);
  //  }				
  //  SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
}


void RM690A0_RGB4_bit(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	uint32_t i=0,k=0;
	for(i=0;i<(120*120);i++)
	{
		SPI_PANEL_CS_Select(channel,0); 
		if(k==0)
		{
			k=1;
			SPI_Write_u8_Cmd_NoCS(SPI4_Mode,0x2c); 
		}
		else SPI_Write_u8_Cmd_NoCS(SPI4_Mode,0x3c); 
		switch(buffer[3])
		{
			case 0x00:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x00);break;
			case 0x01:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x11);break;
			case 0x02:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x22);break;
			case 0x03:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x33);break;
			case 0x04:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x44);break;
			case 0x05:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x55);break;
			case 0x06:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x66);break;
			case 0x07:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x77);break;
			case 0x08:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x88);break;
			case 0x09:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0x99);break;
			case 0x0a:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0xaa);break;
			case 0x0b:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0xbb);break;
			case 0x0c:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0xcc);break;
			case 0x0d:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0xdd);break;
			case 0x0e:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0xee);break;
			case 0x0f:SPI_PANEL_Write_u8_Data_NoCS(SPI4_Mode,0xff);break;	
			case 0x11:
			{
				SPI_PANEL_Write_code(SigMode,channel,0xfe,0x00);
				SPI_PANEL_Write_code(SigMode,channel,0x3a,0x73);
				SPI_PANEL_Write_code(SigMode,channel,0x80,0x0f);
			}break;
			case 0x12:
			{
				SPI_PANEL_Write_code(SigMode,channel,0xfe,0x00);
				SPI_PANEL_Write_code(SigMode,channel,0x3a,0x77);
				SPI_PANEL_Write_code(SigMode,channel,0x80,0x07);
			}break;
			default:break;
		}
		SPI_PANEL_CS_Select(channel,1); 
		
	}
}
void ProcessForIc61(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8 buffer[],u16 LP_B7_Data,u16 HS_B7_Data)//ADD BY PCS
{
	switch(buffer[1]&0xFF)
	{
        case 0x08:                                      //?Gamma
			RM690A0_Write_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); break;
        case 0x09:                                      //?Gamma
			RM690A0_Read_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);  break;
		case 0x07:
			RM690A0_Gamma_OTP_Start(pdev,ep_addr,SigMode ,channel,buffer, LP_B7_Data,HS_B7_Data,RM0A0_otptime);break;
		case 0xDD:           // auto Gamma
			RM690A0_auto_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); break;
		case 0x0f:
			RM690A0_RGB4_bit(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);break;
		default:break;
		
	}	
	
}





 


